home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 297_01 / frmanual.txt < prev    next >
Text File  |  1980-01-01  |  10KB  |  278 lines

  1. Decembre 1988
  2.  
  3.     GUIDE DE REFERENCE POUR L'UTILISATEUR DE SMALL PROLOG
  4.  
  5.  
  6. INTRODUCTION
  7.  
  8. Small Prolog est une implementation dans le domaine public du langage Prolog 
  9. qui est fournie avec ses sources ecrites en langage C.
  10. Small Prolog est inspire d'un gros interpreteur Prolog (FPROLOG)
  11. que j'ai ecrit pour ATARI ST. FPROLOG est disponible mais ne se trouve
  12. pas dans le domaine public.
  13.  
  14. Vous pouvez faire ce qu'il vous plait avec le code de programmation,
  15. sauf de dire que c'est votre propre travail.
  16. Si vous vous servez de SMALL PROLOG pour creer une application commerciale,
  17. j'apprecierais toutefois que vous me fassiez parvenir une copie gratuite
  18. de votre logiciel.
  19.  
  20. Il y a dans le domaine public d'autres implementations mais je n'en connais
  21. pas ou vous pouvez disposer du code source C.
  22. Si il se produit assez d'enthousiasme autour de ce logiciel, je me sentirai
  23. motive pour ecrire une documentation plus complete.
  24.  
  25. Les buts recherches furent:
  26.   - Implementation petite pour un logiciel de developpement d'applications
  27.   - Portabilite maximale
  28.   - Code educatif
  29.   - Extension possible du code
  30.   - Petit code objet
  31.   - Integration facile
  32.   - Meta-programmation aisee
  33. Naturellement ces objectifs n'ont pas ete entierement atteints!
  34. Il est utile de lire le livre de HOGGER "Introduction a la programmation
  35. logique" Masson 1987).
  36. Pour comprendre le code vous pouvez consulter aussi "Computing with logic"
  37. de Maier et Warren, Benjamin Cummings 1988.
  38.  
  39. Il faut mentionner les points suivants:
  40.  
  41. La syntaxe LISPienne a ses avantages pour la meta-programmation et aussi
  42. par son code concis mais je la trouve d'un emploi peu convivial.
  43.  
  44. Il n'y a pas de "ramasse miettes". C'est surprenant a quel point l'on peut
  45. s'en passer. Si vous voulez ramasser les miettes sur le corps des clauses,
  46. je vous suggere de creer une zone separee pour les doublets et de modifier
  47. la routine "get_node()" de telle facon qu'elle alloue un doublet mais ne
  48. retourne que la tete. Puis vous adaptez le "ramasse miettes" au code source
  49. de Xlisp qui est du domaine public.
  50. Vous pouvez aussi ramasser les miettes de la pile des substitutions.
  51. La seule litterature que je connaisse sur ce sujet est un article de
  52. Maurice Bruynehooge dans "Implementations of Prolog" edite par John Campbell,
  53. publie par John Wiley. Le livre est plein d'erreurs de frappe, alors bonne
  54. chance.
  55.  
  56. A l'heure actuelle il y a quelques ameliorations du code qui doivent etre
  57. realisees comme par exemple la recursivite terminale.
  58.  
  59. Le systeme de trace est rudimentaire.
  60.  
  61. Les predicats predefinis standards du Prolog d'Edimbourg ne sont pas tous
  62. implementes. Nous pensons que vous aurez du plaisir a accomplir ce travail.
  63.  
  64.  
  65. SYNTAXE
  66.  
  67. La syntaxe de prolog est extremement simple. Vous pouvez regarder les
  68. fichiers PRPARSE.C et PRSCAN.C fournis pour vous faire une idee, ou bien
  69. lire ce qui suit:
  70.  
  71. Les commentaires ont la meme syntaxe qu'en C:
  72. /* Ceci est un commentaire
  73.  */
  74.  
  75. Le programme peut etre mis en page avec autant d'espaces, de retour chariot,
  76. de tabulations que vous souhaitez mettre, a condition de ne pas couper
  77. en deux des items lexicaux. Un item lexical est un identificateur, un nombre,
  78. ou une chaine.
  79.  
  80. A proprement parler un programme est un ensemble de clauses accompagne d'une
  81. requete, nous appellerons, par abus de langage, un ensemble de clauses un
  82. programme.
  83.  
  84. Ce qui suit est une grammaire "context free" pour la syntaxe.
  85. Les symboles non-terminaux sont differencies des symboles terminaux en les
  86. mettant entre chevrons. Les commentaires suivent les regles de reecriture
  87. et sont a l'interieur de /* */.
  88.  
  89.  
  90. <programme> -> <vide>
  91. <programme> -> <clause> <programme>
  92.  
  93. <clause> -> <regle>
  94. <clause> -> <fait>
  95.  
  96. <regle> -> (<tete> <buts>)
  97.  
  98. <fait> -> (<tete>)
  99. <fait> -> <tete>                        /* alternative possible */
  100.  
  101. <tete> -> (<predicat> <arguments>)
  102. <tete> -> (<predicat> <arguments>|<argument>)
  103. /* utiliser la deuxieme possibilite pour tete avec precaution */
  104.  
  105. <predicat> -> <atome autre que des predicats predefinis>
  106.  
  107. <arguments> -> <vide>
  108. <arguments> -> <argument><arguments>
  109.  
  110. <argument> -> <atome>
  111. <argument> -> <liste>
  112. <argument> -> <entier>
  113. <argument> -> <reel>
  114. <argument> -> <chaine>
  115. <argument> -> <variable>
  116. <argument> -> <char>
  117.  
  118. <atome> -> ()
  119. /* vous pouvez espacer les parentheses */
  120. <atome> -> <lettre minuscule><fin de l'identificateur>
  121.  
  122. <variable> -> _
  123. <variable> -> _<fin de l'identificateur>
  124. <variable> -> < lettre majuscule><fin de l'identificateur>
  125.  
  126. <fin de l'identificateur> -> <vide>
  127. <fin de l'identificateur> -> <lettre de l'alphabet>
  128. <fin de l'identificateur> -> <chiffre>
  129. <fin de l'identificateur> -> _
  130. <fin de l'identificateur> -> <fin de l'identificateur><fin de l'identificateur>
  131.  
  132. <liste> -> (<arguments>)
  133. <liste> -> (<arguments>|<argument>)
  134.  
  135. <entier> -> <signe><entier sans signe>
  136. <entier> -> <entier sans signe>
  137.  
  138. <entier sans signe> -> <chiffre>
  139. <entier sans signe> -> <chiffre><entier sans signe>
  140.  
  141. <signe> -> -
  142. <signe> -> <vide>
  143.  
  144. <buts> -> <but>
  145. <buts> -> <but><buts>
  146.  
  147. <but> -> (<predicat utilisateur><arguments>)
  148. <but> -> (<predicat utilisateur><arguments>|<argument>)
  149. /* ne pas utiliser cette forme si le predicat est predefini */
  150.  
  151. <predicat utilisateur> -> <lettre minuscule><fin de l'identificateur>
  152.  
  153. <reel> -> <entier>.<entier sans signe>
  154. <char> -> '<caractere imprimable>'
  155. <char> -> '\n'
  156. <char> -> '\r'
  157. <char> -> '\t'
  158. <char> -> '\v'
  159. <char> -> '\f'
  160. <char> -> '\''
  161. <char> -> '\"'
  162. <char> -> '\<chiffre octal>'
  163. <char> -> '\<chiffre octal><chiffre octal>'
  164. <char> -> '\<chiffre octal><chiffre octal><chiffre octal>'
  165.  
  166. <chaine> -> <delimiteur de chaine>
  167.             <sequence de caracteres>
  168.             <delimiteur de chaine>
  169. <delimiteur de chaine> -> "
  170. /* ne pas mettre de delimiteur de chaine dans la sequence de caracteres 
  171.  * a moins qu'il est immediatement suivi d'un deuxieme delimiteur.
  172.  */
  173.  
  174. <requete> -> (<buts>)
  175.  
  176. /* fin de la grammaire */
  177.  
  178. exemples de requetes:
  179. ((writes "Salut!")(nl))
  180.  
  181. (nl)
  182.  
  183. ((writes "Quel est votre nom?")(read X)
  184.  (writes "Bonjour ")(display X))
  185.  
  186. (writes "Ceci :"" est un delimiteur de chaine")
  187.  
  188. PREDICATS PREDEFINIS
  189.  
  190. La documentation sur les predicats predefinis est dans le fichier source
  191. PRBLTIN.C. Ils sont prevus pour etre enrichis.
  192. Vous devrez essayer de rester coherent avec ce que vous pourrez trouver
  193. dans le livre de Clocksin et Mellish:"Programming in Prolog" edition
  194. Springer Verlag.
  195. Pour inserer vos propres predicats predefinis, vous devez prendre
  196. connaissance de ce qui suit:
  197. SMALL PROLOG utilise beaucoup de variables globales definies dans le fichier
  198. PRLUSH.C.
  199. "Arguments" est la liste des arguments du but courant et "SubstGoal" est
  200. l'environnement de substitution pour ce but. Pour obtenir les differents
  201. elements de "Arguments" vous pouvez utiliser les macros ARG_XXX du fichier
  202. PRBUILTI.H. Toutes les fonctions utilisent frequemment la fonction
  203. dereference() de PRUNIFY.C, ainsi il est important de comprendre ceci,
  204. de la meme maniere que vous avez compris les types de donnees en BASIC.
  205. Cette fonction dereferencie un terme dans un environnement et met a jour
  206. les variables globales DerefNode et Derefsubst qui representent les objets
  207. dereferencies resultats. Elles sont globales pour conserver l'efficacite.
  208.  
  209.  
  210. UTILISATION DE SMALL PROLOG 
  211.  
  212. Si vous utilisez mon fichier "makefile" alors il vous suffit de taper sprolog
  213. et le programme va consulter un fichier appele sprolog.inf qui contient les
  214. 8 valeurs suivantes:
  215. - taille du tas (dans lequel les clauses sont allouees)
  216. - taille de la zone des chaines
  217. - taille de la pile de controle (utilisee par le mecanisme de resolution)
  218. - taille de la pile des substitutions (utilisee pour enregistrer les
  219.   substitutions - les liens des variables)
  220. - taille de la pile de restauration (utilisee pour remettre a zero la pile de
  221.   substitution)
  222. - taille de la zone des objets provisoires (netoyable avec clean_temp)
  223. - taille du tampon memoire de lecture (utilise pour lire les atomes, les chaines
  224.   etc ...)
  225. - taille du tampon memoire d'impression (utilise pour imprimer n'importe quoi,
  226.   le nom